Функції можна викликати в полі Variables блоку або безпосередньо в тексті відповіді за допомогою #{...}:

#{discord_add_role(message_from, '1465674567090704592')}

ID сервера, каналу, ролі та повідомлення Discord — це довгі числові значення. Найпростіший спосіб скопіювати їх — увімкнути Settings → Advanced → Developer Mode. Після цього в контекстному меню будь-якого об'єкта з'явиться опція Copy ID.

Підключення бота описано в статті How to Create a Chatbot in Discord.

Де взяти ID повідомлення

ID повідомлення, яке активувало блок, зберігається у змінній discord_message_id. Отримувати його окремо не потрібно:

#{discord_delete_message(discord_message_id)}

Якщо вам потрібні дані, яких немає в попередньо визначених змінних, повний вебхук доступний у змінній discord_webhook. Вона заповнюється, коли будь-якому значенню присвоюється змінна save_webhook:

data = discord_webhook["data"]

msg_id = data["id"]

result = discord_reply_to_message(msg_id, "This is a reply to the message")

Змінні, що створюються автоматично

Ці змінні заповнюються автоматично для кожної події та не потребують додаткового налаштування.

Змінна Опис Приклад
guild_id ID сервера 1465674567090704591
discord_event Тип події одним словом message
discord_message_id ID повідомлення з префіксом mid mid1465674569095319625
message_from ID автора події з префіксом uid uid413984787162726410
from_username Ім'я користувача Discord автора 00rei
from_name Відображуване ім'я автора в чаті Rus
username Ім'я користувача для особистих повідомлень боту 00rei
is_bot 1, якщо автор події — інший бот 0
nickname Нікнейм на сервері; порожній, якщо не встановлено Moderator
roles Список ID ролей автора ["1465674567090704592"]
is_admin 1, якщо користувач є адміністратором або власником сервера 1
reply_from ID автора повідомлення, на яке відповідають uid493121376652230668
reply_from_username Ім'я користувача автора, на якого відповідають _deikin
reply_from_name Відображуване ім'я автора, на якого відповідають Rus
reply_to_bot 1, якщо відповідь адресована боту 0
reply_message_id ID повідомлення, на яке відповідають mid1534837349219958804
reply_text Текст повідомлення, на яке відповідають who is on duty today?

Префікси uid, cid та mid є частиною значення. Передавайте ці змінні у функції як є; видаляти префікси не потрібно.

from_name vs. from_username

from_name містить ім'я, яке слід використовувати для звернення до користувача в чаті:

  1. Нікнейм на сервері, якщо встановлено.
  2. Відображуване ім'я облікового запису.
  3. Ім'я користувача.

Це рекомендована змінна для використання у вітаннях, оскільки from_username може виглядати як _deikin або 00rei.

Змінні reply_* заповнюються лише тоді, коли вхідне повідомлення є відповіддю на інше повідомлення. Для звичайних повідомлень вони всі очищаються.

Тому наступна умова надійно відрізняє відповідь від звичайного повідомлення:

#{reply_from != ''}

Змінні nickname, roles та is_admin стосуються автора поточної події.

Discord не надає ці дані для подій реакцій, тому перевірки адміністратора слід виконувати в події повідомлення або слеш-команди.

Текст вхідного повідомлення зберігається у стандартній змінній question, як і в інших каналах.


Події

Окрім звичайних повідомлень, до воронки також надсилаються службові події.

Їхній текст зберігається у змінній question, тому ви можете обробляти їх за допомогою звичайних текстових умов.

discord_event Текст у question Коли виникає
message Текст повідомлення Учасник надсилає повідомлення
message_edit Оновлений текст повідомлення Повідомлення редаговано
interaction /warn @user spam Використано слеш-команду або натиснуто кнопку
reaction_add new_like ❤️ uid413984787162726410 Додано реакцію
reaction_remove reaction_remove ❤️ uid413984787162726410 Видалено реакцію
message_delete message_delete mid1465674569095319625 Повідомлення видалено
messages_delete_bulk messages_delete_bulk 12 Видалено кілька повідомлень
member_join member_join uid413984787162726410 Учасник приєднується до сервера
member_leave member_leave uid413984787162726410 Учасник залишає сервер
member_update member_update uid413984787162726410 Змінюється нікнейм або ролі учасника
member_ban member_ban uid413984787162726410 Учасника забанено
member_unban member_unban uid413984787162726410 Учасника розбанено

Для спеціальної реакції замість самого емодзі використовується ID спеціального емодзі:

new_like beer:1479419477396291696 uid413984787162726410

Детальніше див. у розділі Reactions.

Якщо блок має спрацьовувати лише на звичайні повідомлення, надіслані учасниками, додайте наступну умову:

discord_event == 'message'

Це одразу відфільтровує всі службові події.

Перевірка лише тексту події ненадійна, оскільки учасник може вручну надіслати повідомлення на кшталт member_join.

Важливо: member_update спрацьовує на будь-яке оновлення учасника, включаючи роль, призначену самим ботом. Блок, який реагує на member_update і призначає роль, може створити цикл, тому такі умови завжди слід відповідним чином обмежувати.


Повідомлення

Функція Опис
discord_send_message(channel_id, text) Надіслати повідомлення в будь-який канал
discord_send_dm(user_id, text) Надіслати особисте повідомлення учаснику
discord_reply_to_message(message_id, text) Відповісти на повідомлення
discord_edit_message(message_id, text) Редагувати повідомлення, надіслане ботом
discord_delete_message(message_id) Видалити повідомлення
discord_bulk_delete_messages(channel_id, message_ids) Видалити кілька повідомлень одночасно
discord_get_message(channel_id, message_id) Отримати повідомлення
discord_pin_message(message_id) Закріпити повідомлення
discord_unpin_message(message_id) Відкріпити повідомлення

Обмеження Discord: Немає обмежень за часом для редагування або видалення власних повідомлень. Масове видалення працює лише для повідомлень, які не старші 14 днів, і ви можете видалити від 2 до 100 повідомлень за раз.


Реакції

Функція Опис
discord_send_reaction(message_id, reaction) Додати реакцію
discord_delete_reaction(message_id, reaction, user_id) Видалити реакцію. Якщо user_id пропущено, видаляється реакція бота

Параметр reaction приймає або звичайний емодзі, наприклад ❤️, або ID спеціального емодзі сервера.

Де взяти ID спеціальної реакції

Додайте потрібну спеціальну реакцію до будь-якого повідомлення в каналі.

У чаті з'явиться зворотний виклик такого вигляду:

new_like beer:1479419477396291696 uid413984787162726410

Тут:

beer:1479419477396291696

є ID реакції.

Ви можете скопіювати його та використовувати у функціях реакцій:

#{discord_send_reaction(discord_message_id, 'beer:1479419477396291696')}

Звичайні емодзі відображаються у зворотних викликах як є:

new_like ❤️ uid413984787162726410

де uid413984787162726410 — це ID учасника, який додав реакцію.


Модерація

Функція Опис
discord_timeout_member(user_id, seconds) Тайм-аут учасника на вказану кількість секунд, до 28 днів
discord_remove_timeout(user_id) Дочасне зняття тайм-ауту
discord_kick_member(user_id) Вигнати учасника з сервера; він може повернутися за запрошенням
discord_ban_member(user_id, delete_message_seconds) Забанити учасника; другий аргумент вказує, скільки секунд історії повідомлень видалити, до 7 днів
discord_unban_member(user_id) Розбанити учасника

Discord не дозволяє боту модерувати учасника, чия роль вища за роль бота. Власник сервера також не може бути підданий модерації.


Ролі та учасники

Функція Опис
discord_add_role(user_id, role_id) Призначити роль
discord_remove_role(user_id, role_id) Видалити роль
discord_get_roles() Отримати ролі сервера та їхні ID
discord_get_member(user_id) Отримати дані учасника, включаючи нікнейм, ролі та дату приєднання
discord_set_nickname(user_id, nickname) Змінити нікнейм учасника на сервері

Роль бота повинна бути вищою за роль, яку він призначає.

Роль @everyone та ролі, керовані інтеграціями, включаючи ролі, що належать іншим ботам, не можуть бути призначені.


Канали та тікети

Функція Опис
discord_create_channel(name, type, parent_id, permission_overwrites) Створити канал
discord_delete_channel(channel_id) Видалити канал
discord_set_channel_permission(channel_id, target_id, allow, deny, type) Дозволити або заборонити дозволи каналу
discord_create_invite(channel_id, max_age, max_uses) Створити посилання-запрошення
discord_get_invites() Отримати посилання-запрошення сервера

Для discord_create_channel тип за замовчуванням type:

Значення Тип каналу
0 Текстовий канал
2 Голосовий канал
4 Категорія

Ви можете передати ID категорії в parent_id, щоб створити канал усередині цієї категорії.

Для discord_set_channel_permission останній аргумент визначає, хто отримує дозволи:

Значення Ціль
1 Учасник
0 Роль

Параметри allow та deny приймають такі значення:

Значення Дозвіл
1024 Перегляд каналу
2048 Надсилання повідомлень
3072 Перегляд каналу та надсилання повідомлень
65536 Читання історії повідомлень

Для discord_create_invite час життя запрошення вказується в секундах.

Наприклад:

86400

означає 24 години.

Значення max_uses 0 означає необмежена кількість використань.


Слеш-команди

Функція Опис
discord_get_commands() Отримати команди, зареєстровані на сервері
discord_set_commands(commands) Замінити весь набір команд

discord_set_commands приймає список команд:

#{discord_set_commands('[
  {
    "name": "rules",
    "description": "Show server rules"
  },
  {
    "name": "warn",
    "description": "Issue a warning",
    "options": [
      {
        "type": 6,
        "name": "user",
        "description": "User",
        "required": true
      },
      {
        "type": 3,
        "name": "reason",
        "description": "Reason",
        "required": false
      }
    ]
  }
]')}

Вимоги Discord

  • name має містити лише символи нижнього регістру, без пробілів, і має бути довжиною від 1 до 32 символів.
  • description є обов'язковим і має бути довжиною від 1 до 100 символів.
  • Обов'язкові опції мають бути перед опціональними.
  • Передача порожнього списку видаляє всі команди бота з сервера.

Типи опцій

Тип Опис
3 Рядок
4 Ціле число
5 Булеве значення
6 Учасник
7 Канал
8 Роль

Коли команда викликається, вона надсилається у воронку як рядок, наприклад:

/warn @user spam

Іншими словами, назва команди та значення опцій розділені пробілами.

Ви можете обробляти її за допомогою звичайної текстової умови.

Окрема функція для кнопок не потрібна. Кнопки налаштовуються у звичайному блоці відповіді, а натискання кнопки отримується так само, як і слеш-команда: значення кнопки з'являється в тексті.


Бали та таблиця лідерів

Інтеграція з Discord включає вбудовану систему подяки. Бали нараховуються автору цитованого повідомлення.

Ви можете використовувати її для створення рівнів, рангів і таблиць лідерів.

Функція Опис
discord_add_thanks_score(value) Додати бали автору цитованого повідомлення
discord_add_thanks_score_for_answer(value) Додати бали учаснику, який відповів
discord_minus_thanks_score(value) Видалити бали
discord_get_score(user_id) Повернути бали учасника як число. Без аргументу використовує автора події
discord_get_level(user_id, points_per_level) Отримати рівень учасника. Стандартний поріг: 100 балів за рівень
discord_get_user_info(user_id) Отримати бали, позицію в таблиці лідерів та ім'я як єдиний об'єкт
discord_get_top(count, shift, humanize, delimiter) Отримати таблицю лідерів

Для discord_get_top:

  • count — кількість рядків для повернення;
  • shift — кількість рядків для пропуску, корисно для пагінації;
  • humanize=true — повертає готовий до відображення текст;
  • delimiter — роздільник між ім'ям учасника та балами.

Під час порівняння балів в умові блоку використовуйте discord_get_score. Ця функція повертає число, тому числові порівняння працюють як очікується.


Приклади

Привітання нового учасника через особисте повідомлення

Умова блоку:

member_join

У полі Змінні:

discord_send_dm(
    message_from,
    'Привіт, #{from_name}! Ознайомся із закріпленими правилами.'
)

Видалення повідомлення, що містить стоп-слово, і тайм-аут учасника на 24 години

Умова блоку: список стоп-слів.

Додаткова умова:

is_admin != 1

Функції:

discord_delete_message(discord_message_id)

discord_timeout_member(message_from, 86400)

Призначення ролі за реакцію на конкретне повідомлення

Умова блоку:

new_like 🍕

Додаткова умова:

contains(discord_message_id, '1534927170965602324')

Функція:

discord_add_role(
    message_from,
    '1465674567090704592'
)

Створення приватного каналу для тікету з кнопки

ticket = discord_create_channel(
    'ticket-' + from_username
)

ticket_channel = get(
    get(ticket, 'data'),
    'id'
)

discord_set_channel_permission(
    ticket_channel,
    guild_id,
    None,
    1024,
    0
)

discord_set_channel_permission(
    ticket_channel,
    message_from,
    3072,
    None,
    1
)

discord_send_message(
    ticket_channel,
    'Опишіть вашу проблему одним повідомленням.'
)

Перший рядок дозволів приховує канал від усіх (guild_id тут представляє роль @everyone).

Другий рядок робить канал доступним для учасника, який створив тікет.


Нарахування балів за подяку та призначення ролі на основі рівня

Умова блоку:

thanks;thx;thank you

Додаткова умова:

reply_from != '' and reply_from != message_from and reply_to_bot != 1

Функції:

discord_add_thanks_score(1)

if (discord_get_level(reply_from) >= 1) {
    discord_add_role(
        reply_from,
        '1465674567090704592'
    )
}

Умова:

reply_from != message_from

запобігає нарахуванню балів самим собі.

Умова:

reply_to_bot != 1

запобігає нарахуванню балів боту.


Показ ваших балів за допомогою команди

Умова блоку:

/xp

У полі Змінні:

points = discord_get_score()

lvl = discord_get_level()

Текст відповіді:

#{from_name}, у вас #{points} XP · Рівень #{lvl}

Показ таблиці лідерів за допомогою команди

Умова блоку:

/top

Текст відповіді:

🏆 Таблиця лідерів XP:

#{discord_get_top(10, 0, true, ' — ')}